using Os.Infra;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.Data;

namespace Os.Domain
{
	public class Tempo
	{
	
		private int _idTempo;
		private DateTime _hora;
		private OrdemServico _os;
        private estadoTempo _estadoTempo; 
		private bool _persisted;
		private bool _modified;

        private const string SPINSERT = "SP_TempoINS";
        private const string SPUPDATE = "SP_TempoUPD";
        private const string SPDELETE = "SP_TempoDEL";
        private const string SPSELECT = "SP_TempoSEL";
        private const string SPSELECTID = "SP_TempoSelId";

		public int IdTempo
		{
			get
			{
				return this._idTempo;
			}
			set
			{
				this._idTempo = value;
				this._modified = true;
			}
		}
		public DateTime Hora
		{
			get
			{
                return this._hora;
			}
			set
			{
				this._hora = value;
				this._modified = true;
			}
		}
		public OrdemServico Os
		{
			get
			{
				return this._os;
			}
			set
			{
				this._os = value;
				this._modified = true;
			}
		}
        public estadoTempo EstadoTempo
        {
            get 
            { 
                return this._estadoTempo;  
            }
            set 
            { 
                this._estadoTempo = value;
                this._modified = true;
            }
        }

		public Tempo()
		{
            this._hora = DateTime.Now;
		}
		public Tempo(int idTempo)
		{
			this._idTempo = idTempo;
			this._persisted = true;
		}
		private List<MySqlParameter> ObterParametros()
		{
			return new List<MySqlParameter>
			{
				new MySqlParameter("?parIdTempo", MySqlDbType.Int32, 11), 
				new MySqlParameter("?parHora", MySqlDbType.DateTime), 
				new MySqlParameter("?parStatusTempo", MySqlDbType.Int32,11), 
				new MySqlParameter("?parOs", MySqlDbType.Int32, 11)
			};
		}
		private void PreencherParametros(List<MySqlParameter> parms)
		{
			parms[0].Value = this._idTempo;
			parms[1].Value = this._hora;
            parms[2].Value = this._estadoTempo;
			if (this._os != null)
			{
				parms[3].Value = this._os.IdOrdemServico;
			}
			else
			{
				parms[3].Value = DBNull.Value;
			}
			if (!this._persisted)
			{
				parms[0].Direction = ParameterDirection.Output;
			}
			else
			{
				parms[0].Direction = ParameterDirection.Input;
			}
		}
		private void Inserir()
		{
			List<MySqlParameter> parameters = this.ObterParametros();
			this.PreencherParametros(parameters);
			using (MySqlConnection mySqlConnection = new MySqlConnection(MysqlData.CONN_STRING))
			{
				mySqlConnection.Open();
				try
				{
					MySqlCommand mySqlCommand = MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_TempoINS", parameters);
					this._idTempo = Convert.ToInt32(mySqlCommand.Parameters["?parIdTempo"].Value);
					mySqlCommand.Parameters.Clear();
					this._persisted = true;
					this._modified = false;
				}
				catch (Exception ex)
				{
					throw ex;
				}
			}
		}
		private void Inserir(MySqlTransaction trans)
		{
			List<MySqlParameter> parameters = this.ObterParametros();
			this.PreencherParametros(parameters);
			MySqlCommand mySqlCommand = MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_TempoINS", parameters);
			this._idTempo = Convert.ToInt32(mySqlCommand.Parameters["?parIdTempo"].Value);
			mySqlCommand.Parameters.Clear();
			this._persisted = true;
			this._modified = false;
		}
		private void Atualizar()
		{
			if (this._modified)
			{
				List<MySqlParameter> parameters = this.ObterParametros();
				this.PreencherParametros(parameters);
				MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_TempoUPD", parameters);
				this._modified = false;
			}
		}
		private void Atualizar(MySqlTransaction trans)
		{
			if (this._modified)
			{
				List<MySqlParameter> parameters = this.ObterParametros();
				this.PreencherParametros(parameters);
				MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_TempoUPD", parameters);
				this._modified = false;
			}
		}
		public static void Remover(int idTempo)
		{
			List<MySqlParameter> parms = new List<MySqlParameter>
			{
				new MySqlParameter("?parIdTempo", MySqlDbType.Int32, 11)
			};
			parms[0].Value = idTempo;
			MysqlData.ExecutarComando(CommandType.StoredProcedure, "SP_TempoDEL", parms);
		}
		public static void Remover(MySqlTransaction trans, int idTempo)
		{
			List<MySqlParameter> parms = new List<MySqlParameter>
			{
				new MySqlParameter("?parIdTempo", MySqlDbType.Int32, 11)
			};
			parms[0].Value = idTempo;
			MySqlCommand mySqlCommand = MysqlData.ExecutarComando(trans, CommandType.StoredProcedure, "SP_TempoDEL", parms);
			mySqlCommand.Parameters.Clear();
		}
		public void Salvar()
		{
			if (!this._persisted)
			{
				this.Inserir();
			}
			else
			{
				this.Atualizar();
			}
		}
		public void Salvar(MySqlTransaction trans)
		{
			if (!this._persisted)
			{
				this.Inserir(trans);
			}
			else
			{
				this.Atualizar(trans);
			}
		}
		private static void RealizarPersistencia(IDataReader dado, Tempo objTempo)
		{
			try
			{
				if (dado["idTempo"] != DBNull.Value)
				{
					objTempo._idTempo = Convert.ToInt32(dado["idTempo"]);
				}
				if (dado["hora"] != DBNull.Value)
				{
					objTempo._hora = Convert.ToDateTime(dado["hora"]);
				}
				if (dado["statustempo_idstatustempo"] != DBNull.Value)
				{
                    objTempo._estadoTempo = (estadoTempo)Convert.ToInt32(dado["statustempo_idstatustempo"]);
				}
				if (dado["OrdemServico_IdOrdemServico"] != DBNull.Value)
				{
					objTempo._os = OrdemServico.CarregarObjeto(Convert.ToInt32(dado["OrdemServico_IdOrdemServico"]));
				}
				objTempo._persisted = true;
				objTempo._modified = false;
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}
		public static Tempo CarregarObjeto(int idTempo)
		{
			Tempo tempo = null;
			using (IDataReader dado = Tempo.CarregarDados(idTempo))
			{
				if (dado.Read())
				{
					tempo = new Tempo();
					Tempo.RealizarPersistencia(dado, tempo);
				}
                dado.Close();
                dado.Dispose();
			}
			return tempo;
		}
		public static List<Tempo> CarregarPorOs(OrdemServico os)
		{
			List<Tempo> tempos = new List<Tempo>();
			using (IDataReader dado = Tempo.CarregarDadosPorOs(os.IdOrdemServico))
			{
				while (dado.Read())
				{
					Tempo tempo = new Tempo();
					Tempo.RealizarPersistencia(dado, tempo);    
                    tempos.Add(tempo);
				}
                dado.Close();
                dado.Dispose();
			}
			return tempos;
		}
        public static Tempo CarregarUltimoTempo(OrdemServico os)
        {
            Tempo tempo = null;
            using (IDataReader dado = Tempo.CarregarUltimosDados(os.IdOrdemServico))
            {
                if (dado.Read())
                {
                    tempo = new Tempo();
                    Tempo.RealizarPersistencia(dado, tempo);
                }
                dado.Close();
                dado.Dispose();
            }
            return tempo;
        }
		public void CompletarObjeto()
		{
			using (IDataReader dado = Tempo.CarregarDados(this._idTempo))
			{
                if (dado.Read())
                {
                    Tempo.RealizarPersistencia(dado, this);
                }
                dado.Close();
                dado.Dispose();
			}
		}
		private static IDataReader CarregarDados(int idTempo)
		{
			List<MySqlParameter> parms = new List<MySqlParameter> { new MySqlParameter("?parIdTempo", idTempo) };
			return MysqlData.ExecutarLeitura(CommandType.StoredProcedure, "SP_TempoSelId", parms);
		}
		private static IDataReader CarregarDadosPorOs(int idOs)
		{
            List<MySqlParameter> parms = new List<MySqlParameter> { new MySqlParameter("?parOrdemServico", idOs )};
			return MysqlData.ExecutarLeitura(CommandType.StoredProcedure, "SP_TempoSELOs", parms);
		}
        private static IDataReader CarregarUltimosDados(int os)
        {
            List<MySqlParameter> parms = new List<MySqlParameter> { new MySqlParameter("?parOrdemServico", os) };
            return MysqlData.ExecutarLeitura(CommandType.StoredProcedure, "SP_UltimoTempoSELOs", parms);
        }
	}
}
